package others;


/**
 * 因为a++执行了三步骤操作
 *
 * 1.线程读取a值
 * 2.a+1
 * 3.线程内存写值
 *
 * 当一个线程在执行2操作时，还未执行操作3；其他线程抢先把123又执行了一遍；会导致a被加了两次，但是更新时发现只累加了一次；
 * 导致最终打印结果时小于loopCount*2的
 *
 */
public class SynchronizedTest implements Runnable {
    static int a = 0;
    static int loopCount = 5000;
    Object obj = new Object();

    public static void main(String[] args) throws InterruptedException {
        SynchronizedTest syncRunnable = new SynchronizedTest();
        Thread t1 = new Thread(syncRunnable);
        Thread t2 = new Thread(syncRunnable);
        t1.start();t2.start();
        t1.join();t2.join();
        System.out.println(a);
    }

//    改进方式，通过**同步代码块**进行原子操作绑定
//    @Override
//    public void run() {
//        synchronized (obj) {
//            //有些电脑可能比较好，需要调试一下循环次数
//            for (int i = 0; i < loopCount; i++) {
//                a++;
//            }
//        }
//    }

    @Override
    public void run() {
        //有些电脑可能比较好，需要调试一下循环次数
        for (int i = 0; i < loopCount; i++) {
            a++;
        }
    }
}
